package jmine.tec.di.resolver;

import jmine.tec.di.cache.TypeMatch;
import jmine.tec.di.scope.TypedScope;
import jmine.tec.di.type.TypeConvertionException;
import jmine.tec.di.wrapper.Wrapper;

/**
 * Resolve um objeto - em outras palavras, busca uma dependencia de alguma maneira
 */
public interface ObjectResolver extends TypeMatch {

    /**
     * Resolve uma dependencia
     * 
     * @param properties o {@link TypedScope} de onde tirar propriedades dinamicas
     * @param wrapper the wrapper
     * @param requiredComponentClass {@link Class}
     * @return {@link Object}
     * @throws TypeConvertionException e
     */
    Object resolveObject(TypedScope properties, Wrapper wrapper, Class<?> requiredComponentClass) throws TypeConvertionException;

    /**
     * Verifica se esta propriedade é 'resolvível'.
     * 
     * @param properties {@link TypedScope}
     * @return boolean
     */
    boolean isResolvable(TypedScope properties);

    /**
     * @return boolean
     */
    boolean isStatic();

    /**
     * Array vazio
     */
    ObjectResolver[] EMPTY_OBJECT_RESOLVER_ARRAY = new ObjectResolver[0];

}
